Async Command এবং Task Handling হল MVVM প্যাটার্নের গুরুত্বপূর্ণ অংশ, যেখানে ViewModel-এ asynchronous অপারেশন পরিচালনা করা হয়। এটি UI এর সাড়া দেওয়ার ক্ষমতা (responsiveness) বজায় রাখে এবং দীর্ঘ সময়ের কার্যক্রম যেমন ডেটা লোড, নেটওয়ার্ক কল, বা ফাইল অপারেশনগুলির জন্য অ্যাসিঙ্ক্রোনাস কার্যক্রম ব্যবহার করা হয়। এটি ব্যবহারকারীর অভিজ্ঞতা উন্নত করে, কারণ UI কখনোই ব্লক হয় না এবং ইউজার সাড়া পেতে পারে।
Async Command হল একটি কাস্টম কমান্ড (বা এমনকি স্ট্যান্ডার্ড কমান্ড) যা asynchronous মেথড চালাতে সক্ষম। এটি ICommand ইন্টারফেসে ইমপ্লিমেন্ট করা হয় এবং সাধারণত ViewModel-এ ব্যবহার করা হয়, যাতে UI-এর কোন ইভেন্ট (যেমন বাটন ক্লিক) থেকে asynchronous কার্যক্রম চালানো যায়।
এখানে একটি উদাহরণ দেওয়া হলো যেখানে AsyncCommand ব্যবহার করে আমরা একটি দীর্ঘ সময়ের নেটওয়ার্ক কল বা অন্যান্য সময়সাপেক্ষ অপারেশন পরিচালনা করব।
প্রথমে আমরা AsyncCommand ক্লাস তৈরি করব যা ICommand ইন্টারফেসের একটি কাস্টম বাস্তবায়ন হবে এবং এটি async মেথড রান করবে।
public class AsyncCommand : ICommand
{
private readonly Func<Task> _execute;
private readonly Func<bool> _canExecute;
public AsyncCommand(Func<Task> execute, Func<bool> canExecute = null)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute();
}
public event EventHandler CanExecuteChanged;
public async void Execute(object parameter)
{
if (CanExecute(parameter))
{
await _execute();
}
}
public void RaiseCanExecuteChanged()
{
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}
এখানে, AsyncCommand
দুটি ডেলিগেট নেবে:
এখন, ViewModel-এ AsyncCommand ব্যবহার করি। উদাহরণস্বরূপ, আমরা একটি Button ক্লিক ইভেন্টের মাধ্যমে ডেটা লোড করব যা একটি async মেথড কল করবে।
public class MyViewModel : INotifyPropertyChanged
{
private readonly IEventAggregator _eventAggregator;
public ICommand LoadDataCommand { get; private set; }
public MyViewModel(IEventAggregator eventAggregator)
{
_eventAggregator = eventAggregator;
LoadDataCommand = new AsyncCommand(LoadData);
}
private async Task LoadData()
{
// ডেটা লোড করার জন্য আসল অ্যাসিঙ্ক্রোনাস কার্যক্রম
var data = await GetDataFromServer();
// ডেটা UI-এ রিফ্লেক্ট করার জন্য প্রপার্টি আপডেট
OnPropertyChanged(nameof(Data));
}
private async Task<string> GetDataFromServer()
{
await Task.Delay(2000); // একটি নেটওয়ার্ক কল বা দীর্ঘসময় কম্পিউটেশন সিমুলেট করা হচ্ছে
return "Data Loaded Successfully!";
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
এখানে, LoadDataCommand একটি AsyncCommand যা LoadData
মেথডকে কল করবে। এই মেথডটি একটি Task ফেরত দেয়, অর্থাৎ এটি আসিঙ্ক্রোনাসভাবে ডেটা লোড করতে সক্ষম।
এখন, XAML ফাইলের মধ্যে AsyncCommand-এর জন্য বাইন্ডিং তৈরি করতে হবে। এই উদাহরণে, আমরা একটি Button ব্যবহার করব যা ক্লিক হলে LoadDataCommand কল করবে।
<Window x:Class="AsyncCommandExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Async Command Example" Height="350" Width="525">
<Window.DataContext>
<local:MyViewModel />
</Window.DataContext>
<Grid>
<Button Content="Load Data"
Command="{Binding LoadDataCommand}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</Window>
এখানে, Button এর Command
প্রপার্টি ViewModel এর LoadDataCommand
এর সাথে বাইন্ড করা হয়েছে। এর ফলে, যখন ব্যবহারকারী বাটনে ক্লিক করবে, তখন LoadData মেথড asynchronously চলবে।
AsyncCommand এবং Task Handling ব্যবহার করার সময়, আপনার UI কখনোই ব্লক হবে না। কারণ Task ক্লাস অ্যাসিঙ্ক্রোনাস অপারেশন পরিচালনা করতে পারে, এবং এর ফলে UI থ্রেড ব্যস্ত না হয়ে responsive থাকে। যখনই Task শেষ হবে, তখন UI স্বয়ংক্রিয়ভাবে রিফ্রেশ হবে এবং নতুন ডেটা বা ফলাফল দেখাবে।
AsyncCommand এবং Task Handling MVVM প্যাটার্নে একটি অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে, যা UI কে সুসংগঠিত রাখে এবং অ্যাসিঙ্ক্রোনাস কার্যক্রম পরিচালনা করতে সাহায্য করে।
common.read_more